/* 
访问修饰符: 用来描述类内部的属性/方法的可访问性
  public: 默认值, 公开的外部也可以访问
  protected: 类内部和子类可以访问
  private: 只能类内部可以访问
*/

(function () {

  class Animal {
    public name: string; // 完全公开的, 外部都可见
    protected age: number = 2; // 受保护的, 外部只有子类型可见
    private sex: string = '雄'; // 私有的, 只能内部可见
    
    constructor (name: string) {
      this.name = name
    }

    run (distance: number=0) {
      console.log(this.sex)
      console.log(`${this.name} run ${distance}m`)
    }

  }


  class Snake extends Animal {
    constructor (name: string) {
      // 调用父类型构造方法
      super(name)
    }

    // 重写父类型的方法
    run (distance: number=5) {
      console.log(this.name, this.age/* , this.sex */)
    }
  }

  const a = new Animal('abc')
  // a.age  // error
  a.name
  // a.sex   // error
  
})()